Hi, I am trying to create a small Redmine wrapper with Zinc, using Redmine REST API And I am having a problem to update issues in redmine from zinc. In curl, I can do: curl -v -H "Content-Type: application/json" -X PUT --data-binary '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }' -u anquetil:<mypasswd> http://<theserver>/redmine/issues/430.json and this updates issue #430 by changing its subject and notes. For information, the trace given by curl (-v) is: * Trying <theserver>... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to <theserver> (<theserver>) port 80 (#0) * Server auth using Basic with user 'anquetil'
PUT /redmine/issues/430.json HTTP/1.1 Host: <theserver> Authorization: Basic YW5xdWV0aWw6UjNkTTFuMy1wYXNz User-Agent: curl/7.47.0 Accept: */* Content-Type: application/json Content-Length: 110
} [110 bytes data] * upload completely sent off: 110 out of 110 bytes 100 110 0 0 100 110 0 546 --:--:-- --:--:-- --:--:-- 544< HTTP/1.1 200 OK < Date: Thu, 02 Feb 2017 12:18:41 GMT < Server: Apache/2.2.22 (Ubuntu) < X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.21 < X-Rack-Cache: invalidate, pass < X-Request-Id: 73f75565... < X-UA-Compatible: IE=Edge,chrome=1 < Cache-Control: no-cache < X-Runtime: 0.994081 < Set-Cookie: _redmine_session=BAh7ByIP...; path=/; HttpOnly < Set-Cookie: autologin=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT < Status: 200 < Content-Length: 0 < Content-Type: application/json; charset=utf-8 < 100 110 0 0 100 110 0 105 0:00:01 0:00:01 --:--:-- 105 * Connection #0 to host <theserver> left intact The problem is that I cannot replicate that with Zinc: cont := '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }'. ent := ((ZnHeaders requestHeadersFor: 'http://<theserver>/redmine/' asZnUrl ) contentType: (ZnMimeType main: 'application' sub: 'json')) ; contentLength: cont size. ZnClient new beOneShot ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put: 'http://<theserver>/redmine/issues/430.json' contents: cont ; response. if I inspect the ZnHeader constructed, it seems to have all headers that curl traces except the Authorization: Basic one: The response of ZnClient is "200 OK", with again the same headers as reported by curl Yet the issue remains unchanged on the redmine server (contrary to curl evidently) Can anyone explain where the error could be ? Any help will be gladly welcome nicolas -- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
On 2 Feb 2017, at 16:51, Nicolas Anquetil <nicolas.anquetil@inria.fr> wrote:
Hi,
I am trying to create a small Redmine wrapper with Zinc, using Redmine REST API
And I am having a problem to update issues in redmine from zinc. In curl, I can do:
curl -v -H "Content-Type: application/json" -X PUT --data-binary '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }' -u anquetil:<mypasswd> http://<theserver>/redmine/issues/430.json and this updates issue #430 by changing its subject and notes.
For information, the trace given by curl (-v) is:
* Trying <theserver>... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to <theserver> (<theserver>) port 80 (#0) * Server auth using Basic with user 'anquetil'
PUT /redmine/issues/430.json HTTP/1.1 Host: <theserver> Authorization: Basic YW5xdWV0aWw6UjNkTTFuMy1wYXNz User-Agent: curl/7.47.0 Accept: */* Content-Type: application/json Content-Length: 110
} [110 bytes data] * upload completely sent off: 110 out of 110 bytes 100 110 0 0 100 110 0 546 --:--:-- --:--:-- --:--:-- 544< HTTP/1.1 200 OK < Date: Thu, 02 Feb 2017 12:18:41 GMT < Server: Apache/2.2.22 (Ubuntu) < X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.21 < X-Rack-Cache: invalidate, pass < X-Request-Id: 73f75565... < X-UA-Compatible: IE=Edge,chrome=1 < Cache-Control: no-cache < X-Runtime: 0.994081 < Set-Cookie: _redmine_session=BAh7ByIP...; path=/; HttpOnly < Set-Cookie: autologin=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT < Status: 200 < Content-Length: 0 < Content-Type: application/json; charset=utf-8 < 100 110 0 0 100 110 0 105 0:00:01 0:00:01 --:--:-- 105 * Connection #0 to host <theserver> left intact The problem is that I cannot replicate that with Zinc:
cont := '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }'. ent := ((ZnHeaders requestHeadersFor: 'http://<theserver>/redmine/' asZnUrl ) contentType: (ZnMimeType main: 'application' sub: 'json')) ; contentLength: cont size.
ZnClient new beOneShot ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put: 'http://<theserver>/redmine/issues/430.json' contents: cont ; response.
You are doing something double (ent & cont are the same). Also, I usually start by setting the URL and continue from there. Could you try: ZnClient new beOneShot ; url: 'http://<theserver>/redmine/issues/430.json' ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put ; yourself. I would inspect the instance so you can see both the request and response. Does this work ? Also, the JSON can be generated from objects instead of being written as a string, but you knew that, right ?
if I inspect the ZnHeader constructed, it seems to have all headers that curl traces except the Authorization: Basic one:
<cicgeiiljjcidaam.png>
The response of ZnClient is "200 OK", with again the same headers as reported by curl
<mjlnpnjhhegjmhnl.png>
Yet the issue remains unchanged on the redmine server (contrary to curl evidently)
Can anyone explain where the error could be ? Any help will be gladly welcome
nicolas
-- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
Hi thanks Sven, it now works. from your answer, I could infer the final solution. Apart from your suggestions, the content-type: also had to be called on ZnClient and voila! nicolas On 02/02/2017 17:11, Sven Van Caekenberghe wrote:
On 2 Feb 2017, at 16:51, Nicolas Anquetil <nicolas.anquetil@inria.fr> wrote:
Hi,
I am trying to create a small Redmine wrapper with Zinc, using Redmine REST API
And I am having a problem to update issues in redmine from zinc. In curl, I can do:
curl -v -H "Content-Type: application/json" -X PUT --data-binary '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }' -u anquetil:<mypasswd> http://<theserver>/redmine/issues/430.json and this updates issue #430 by changing its subject and notes.
For information, the trace given by curl (-v) is:
* Trying <theserver>... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to <theserver> (<theserver>) port 80 (#0) * Server auth using Basic with user 'anquetil'
PUT /redmine/issues/430.json HTTP/1.1 Host: <theserver> Authorization: Basic YW5xdWV0aWw6UjNkTTFuMy1wYXNz User-Agent: curl/7.47.0 Accept: */* Content-Type: application/json Content-Length: 110
} [110 bytes data] * upload completely sent off: 110 out of 110 bytes 100 110 0 0 100 110 0 546 --:--:-- --:--:-- --:--:-- 544< HTTP/1.1 200 OK < Date: Thu, 02 Feb 2017 12:18:41 GMT < Server: Apache/2.2.22 (Ubuntu) < X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.21 < X-Rack-Cache: invalidate, pass < X-Request-Id: 73f75565... < X-UA-Compatible: IE=Edge,chrome=1 < Cache-Control: no-cache < X-Runtime: 0.994081 < Set-Cookie: _redmine_session=BAh7ByIP...; path=/; HttpOnly < Set-Cookie: autologin=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT < Status: 200 < Content-Length: 0 < Content-Type: application/json; charset=utf-8 < 100 110 0 0 100 110 0 105 0:00:01 0:00:01 --:--:-- 105 * Connection #0 to host <theserver> left intact The problem is that I cannot replicate that with Zinc:
cont := '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }'. ent := ((ZnHeaders requestHeadersFor: 'http://<theserver>/redmine/' asZnUrl ) contentType: (ZnMimeType main: 'application' sub: 'json')) ; contentLength: cont size.
ZnClient new beOneShot ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put: 'http://<theserver>/redmine/issues/430.json' contents: cont ; response. You are doing something double (ent & cont are the same). Also, I usually start by setting the URL and continue from there. Could you try:
ZnClient new beOneShot ; url: 'http://<theserver>/redmine/issues/430.json' ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put ; yourself.
I would inspect the instance so you can see both the request and response.
Does this work ?
Also, the JSON can be generated from objects instead of being written as a string, but you knew that, right ?
if I inspect the ZnHeader constructed, it seems to have all headers that curl traces except the Authorization: Basic one:
<cicgeiiljjcidaam.png>
The response of ZnClient is "200 OK", with again the same headers as reported by curl
<mjlnpnjhhegjmhnl.png>
Yet the issue remains unchanged on the redmine server (contrary to curl evidently)
Can anyone explain where the error could be ? Any help will be gladly welcome
nicolas
-- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
-- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
Well, now that it works, we can make it better ;-) This is a more correct way to do your call: ZnClient new beOneShot; contentWriter: [ :data | ZnEntity with: (STONJSON toString: data ) type: ZnMimeType applicationJson ]; url: 'http://server.com/redmine/issues/430.json'; username: 'anquetil' password: '<mypasswd>'; contents: { #issue -> { #subject -> 'Subject different changed'. #notes -> 'The subject was changed changed' } asDictionary } asDictionary; put. It is all in one expression now, but there normally is a common configuration part for the ZnClient, and then a part that is different for each call. #contentWriter: is part of the configuration, while #contents: is your data. The content writer takes your data in as objects and turns it into a typed entity. (There is also a corresponding #contentReader: that you can use to parse JSON coming back, if necessary). Sven
On 2 Feb 2017, at 17:31, Nicolas Anquetil <nicolas.anquetil@inria.fr> wrote:
Hi
thanks Sven, it now works.
from your answer, I could infer the final solution. Apart from your suggestions, the content-type: also had to be called on ZnClient and voila!
nicolas
On 02/02/2017 17:11, Sven Van Caekenberghe wrote:
On 2 Feb 2017, at 16:51, Nicolas Anquetil <nicolas.anquetil@inria.fr> wrote:
Hi,
I am trying to create a small Redmine wrapper with Zinc, using Redmine REST API
And I am having a problem to update issues in redmine from zinc. In curl, I can do:
curl -v -H "Content-Type: application/json" -X PUT --data-binary '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }' -u anquetil:<mypasswd> http://<theserver>/redmine/issues/430.json and this updates issue #430 by changing its subject and notes.
For information, the trace given by curl (-v) is:
* Trying <theserver>... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to <theserver> (<theserver>) port 80 (#0) * Server auth using Basic with user 'anquetil'
PUT /redmine/issues/430.json HTTP/1.1 Host: <theserver> Authorization: Basic YW5xdWV0aWw6UjNkTTFuMy1wYXNz User-Agent: curl/7.47.0 Accept: */* Content-Type: application/json Content-Length: 110
} [110 bytes data] * upload completely sent off: 110 out of 110 bytes 100 110 0 0 100 110 0 546 --:--:-- --:--:-- --:--:-- 544< HTTP/1.1 200 OK < Date: Thu, 02 Feb 2017 12:18:41 GMT < Server: Apache/2.2.22 (Ubuntu) < X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.21 < X-Rack-Cache: invalidate, pass < X-Request-Id: 73f75565... < X-UA-Compatible: IE=Edge,chrome=1 < Cache-Control: no-cache < X-Runtime: 0.994081 < Set-Cookie: _redmine_session=BAh7ByIP...; path=/; HttpOnly < Set-Cookie: autologin=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT < Status: 200 < Content-Length: 0 < Content-Type: application/json; charset=utf-8 < 100 110 0 0 100 110 0 105 0:00:01 0:00:01 --:--:-- 105 * Connection #0 to host <theserver> left intact The problem is that I cannot replicate that with Zinc:
cont := '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }'. ent := ((ZnHeaders requestHeadersFor: 'http://<theserver>/redmine/' asZnUrl ) contentType: (ZnMimeType main: 'application' sub: 'json')) ; contentLength: cont size. ZnClient new beOneShot ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put: 'http://<theserver>/redmine/issues/430.json' contents: cont ; response. You are doing something double (ent & cont are the same). Also, I usually start by setting the URL and continue from there. Could you try:
ZnClient new beOneShot ; url: 'http://<theserver>/redmine/issues/430.json' ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put ; yourself.
I would inspect the instance so you can see both the request and response.
Does this work ?
Also, the JSON can be generated from objects instead of being written as a string, but you knew that, right ?
if I inspect the ZnHeader constructed, it seems to have all headers that curl traces except the Authorization: Basic one:
<cicgeiiljjcidaam.png>
The response of ZnClient is "200 OK", with again the same headers as reported by curl
<mjlnpnjhhegjmhnl.png>
Yet the issue remains unchanged on the redmine server (contrary to curl evidently)
Can anyone explain where the error could be ? Any help will be gladly welcome
nicolas
-- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
-- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
great I will not have time to look at it today, but I will definitely follow your suggestions, especially the contentReader:/contentWriter: part, coupled with JSON thanks again nicolas On 02/02/2017 18:29, Sven Van Caekenberghe wrote:
Well, now that it works, we can make it better ;-)
This is a more correct way to do your call:
ZnClient new beOneShot; contentWriter: [ :data | ZnEntity with: (STONJSON toString: data ) type: ZnMimeType applicationJson ]; url: 'http://server.com/redmine/issues/430.json'; username: 'anquetil' password: '<mypasswd>'; contents: { #issue -> { #subject -> 'Subject different changed'. #notes -> 'The subject was changed changed' } asDictionary } asDictionary; put.
It is all in one expression now, but there normally is a common configuration part for the ZnClient, and then a part that is different for each call. #contentWriter: is part of the configuration, while #contents: is your data. The content writer takes your data in as objects and turns it into a typed entity. (There is also a corresponding #contentReader: that you can use to parse JSON coming back, if necessary).
Sven
On 2 Feb 2017, at 17:31, Nicolas Anquetil <nicolas.anquetil@inria.fr> wrote:
Hi
thanks Sven, it now works.
from your answer, I could infer the final solution. Apart from your suggestions, the content-type: also had to be called on ZnClient and voila!
nicolas
On 02/02/2017 17:11, Sven Van Caekenberghe wrote:
On 2 Feb 2017, at 16:51, Nicolas Anquetil <nicolas.anquetil@inria.fr> wrote:
Hi,
I am trying to create a small Redmine wrapper with Zinc, using Redmine REST API
And I am having a problem to update issues in redmine from zinc. In curl, I can do:
curl -v -H "Content-Type: application/json" -X PUT --data-binary '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }' -u anquetil:<mypasswd> http://<theserver>/redmine/issues/430.json and this updates issue #430 by changing its subject and notes.
For information, the trace given by curl (-v) is:
* Trying <theserver>... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to <theserver> (<theserver>) port 80 (#0) * Server auth using Basic with user 'anquetil'
PUT /redmine/issues/430.json HTTP/1.1 Host: <theserver> Authorization: Basic YW5xdWV0aWw6UjNkTTFuMy1wYXNz User-Agent: curl/7.47.0 Accept: */* Content-Type: application/json Content-Length: 110
} [110 bytes data] * upload completely sent off: 110 out of 110 bytes 100 110 0 0 100 110 0 546 --:--:-- --:--:-- --:--:-- 544< HTTP/1.1 200 OK < Date: Thu, 02 Feb 2017 12:18:41 GMT < Server: Apache/2.2.22 (Ubuntu) < X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.21 < X-Rack-Cache: invalidate, pass < X-Request-Id: 73f75565... < X-UA-Compatible: IE=Edge,chrome=1 < Cache-Control: no-cache < X-Runtime: 0.994081 < Set-Cookie: _redmine_session=BAh7ByIP...; path=/; HttpOnly < Set-Cookie: autologin=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT < Status: 200 < Content-Length: 0 < Content-Type: application/json; charset=utf-8 < 100 110 0 0 100 110 0 105 0:00:01 0:00:01 --:--:-- 105 * Connection #0 to host <theserver> left intact The problem is that I cannot replicate that with Zinc:
cont := '{ "issue": { "subject": "Subject different changed", "notes": "The subject was changed changed" } }'. ent := ((ZnHeaders requestHeadersFor: 'http://<theserver>/redmine/' asZnUrl ) contentType: (ZnMimeType main: 'application' sub: 'json')) ; contentLength: cont size. ZnClient new beOneShot ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put: 'http://<theserver>/redmine/issues/430.json' contents: cont ; response. You are doing something double (ent & cont are the same). Also, I usually start by setting the URL and continue from there. Could you try:
ZnClient new beOneShot ; url: 'http://<theserver>/redmine/issues/430.json' ; entity: ent ; username: 'anquetil' password: '<mypasswd>' ; put ; yourself.
I would inspect the instance so you can see both the request and response.
Does this work ?
Also, the JSON can be generated from objects instead of being written as a string, but you knew that, right ?
if I inspect the ZnHeader constructed, it seems to have all headers that curl traces except the Authorization: Basic one:
<cicgeiiljjcidaam.png>
The response of ZnClient is "200 OK", with again the same headers as reported by curl
<mjlnpnjhhegjmhnl.png>
Yet the issue remains unchanged on the redmine server (contrary to curl evidently)
Can anyone explain where the error could be ? Any help will be gladly welcome
nicolas
-- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
-- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
-- Nicolas Anquetil -- MCF (HDR) Project-Team RMod
participants (2)
-
Nicolas Anquetil -
Sven Van Caekenberghe