<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1421633090;
        mso-list-type:hybrid;
        mso-list-template-ids:-2066085050 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal><span style='color:#1F497D'>As a result of some debugging with significant help from Viktor Naumov, we’ve been able to solve the problem.<br><br>In fact there are two problems:<o:p></o:p></span></p><p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span style='color:#1F497D'><span style='mso-list:Ignore'>1.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='color:#1F497D'>The example in the ripe_atlas_api_V2_manual.pdf is wrong<o:p></o:p></span></p><p class=MsoListParagraph style='text-indent:-.25in;mso-list:l0 level1 lfo1'><![if !supportLists]><span style='color:#1F497D'><span style='mso-list:Ignore'>2.<span style='font:7.0pt "Times New Roman"'>       </span></span></span><![endif]><span style='color:#1F497D'>The example shows using curl under UNIX; Windows requires a completely different approach to make the curl command word.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>The example in the manual (page 84) shows JSON that it not accepted by atlas.ripe.net – the outer “layer” of JSON needs to be removed.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>So rather than<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                </span><span style='font-family:"Courier New",serif'>'{"probes":[{"action":"add","requested":1,"type":"country","value":"NL"}]}'</span><span style='color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>you need to use<o:p></o:p></span></p><p class=MsoNormal style='text-indent:.5in'><span style='font-family:"Courier New",serif'>'{"action":"add","requested":1,"type":"country","value":"NL"}'</span><span style='color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>And, while the example works on UNIX, it does not work, as shown, on Windows.<br>It took a while to work out why.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>It appears that, in UNIX the single quote is used to escape the contents in between, so what gets sent to the HTTP server is just<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>                </span><span style='font-family:"Courier New",serif'>{"action":"add","requested":1,"type":"country","value":"NL"}</span><span style='color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>But this “convention”  does not work on Windows.<br>Instead, the single quotes should be removed, and then *<b>every</b>* double-quote has to be escaped, with a backslash character, in order for the correct JSON to be sent to the HTTP server.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>This is the corrected version of the example in the API manual for a UNIX-based system:<o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt;font-family:"Courier New",serif'>~$ curl -H "Content-Type: application/json" -H "Accept: application/json" -X POST -d '{"action":"add","requested":1,"type":"country","value":"NL"}' https://atlas.ripe.net/api/v2/measurements/100076/participation-requests/?key=YOUR_API_KEY<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>And this is the version that needs to be used for a Windows system:<o:p></o:p></span></p><p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt;font-family:"Courier New",serif'>C:\> curl -H "Content-Type: application/json" -H "Accept: application/json" -X POST -d {\"action\":\"add\",\"requested\":1,\"type\":\"country\",\"value\":\"NL\"} https://atlas.ripe.net/api/v2/measurements/100076/participation-requests/?key=YOUR_API_KEY<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>Apologies for the poor line-breaking in the above two examples in this email message.<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='color:#1F497D'>colin<o:p></o:p></span></p><p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal><b>From:</b> ripe-atlas [mailto:ripe-atlas-bounces@ripe.net] <b>On Behalf Of </b>Colin Strutt<br><b>Sent:</b> Sunday, April 2, 2017 10:38 AM<br><b>To:</b> ripe-atlas@ripe.net<br><b>Subject:</b> [atlas] Problems trying to add a probe to a measurement<o:p></o:p></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’m trying to add a probe, by probe number, to an existing, running measurement, using curl, following the example and description on page 84 of the “RIPE Atlas API v2 manual”. However, I’m getting an error message that does not clearly point me to the problem, and thus allow me to correct my error.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Here’s what I’m entering (with the <…> as placeholders, explained below)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal style='margin-left:.5in'><span style='font-family:"Courier New",serif'>curl -H "Content-Type: application/json" -H "Accept: application/json" -X POST -d '{"probes":[{"action":"add","requested":1,"type":"probes","value":"<p>"}]}' https://atlas.ripe.net/api/v2/measurements/<m>/participation-requests/?key=<a><o:p></o:p></span></p><p class=MsoNormal>where:<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><p> is the number of the probe I’m trying to add, and I can access it at <span style='font-family:"Courier New",serif'>https://atlas.ripe.net/probes/<p></span><o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><m> is the measurement to which I’m trying to add it – it’s a running measurement, and I can access it at <span style='font-family:"Courier New",serif'>https://atlas.ripe.net/measurements/<m></span><o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><a> is the API key, which is enabled and has “Update an existing measurement” granted<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The error I get back is:<o:p></o:p></p><p class=MsoNormal style='margin-left:.5in'><span style='font-family:"Courier New",serif'>{"error":{"status":400,"code":104,"detail":"JSON parse error - No JSON object could be decoded","title":"Bad Request"}}<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In case it’s relevant, I’m running curl 7.53.1 on Windows 10.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Thanks in advance for any suggestions.<o:p></o:p></p><p class=MsoNormal>colin<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>